package jm.nj.demo05mian.demo03;

import java.lang.reflect.Executable;

/*
* 运行时期异常
* 异常分为编译异常和运行期异常
*           编译异常:调用了抛出异常的方法,不处理异常就编译失败 (try throws)
*           运行异常:抛出的异常是RuntimeException类,或者是他的子类
*                   NullPointerException,ArrayIndexOutOfBoundsException等都属于运行时期异常
* 运行期异常的特点:
*           方法中抛出运行时期异常,new XXXRuntimeException
*           方法定义中无需throw声明,调用者也无需处理此异常
* 设计原因:
*           运行 异常,不能发生,但是如果发生了,程序人员停止程序,修改源代码
*           运行异常,一旦发生,不要处理,请你修改源代码,运行异常一旦发生,后面代码没有执行意义
* */
public class Demo05RuntimeExecption {
    public static void main(String[] args) /*throws Exception*/ {
        try{
            //调用了声明编译期异常的方法,必须处理,要么抛出,要么try..catch'
             show();

        }catch (Exception e){
            System.out.println("---");
        }

        int[] arr = new int[4];
        show2(arr);
    }


    /*
    * 定义一个抛出运行期异常的方法
    * 方法内部抛出了运行异常,方法上无需说明
    * 方法的调用者无需处理
    * 对数组 5 索引进行判断,如果 5 索引位置的元素大于 100,将 5 索引上的数据/2 否则除以 3
    * */

    public static void show2(int[] arr) /*throws Exception */{
        if(arr.length<5){
            throw new RuntimeException("数组的索引小于5");

        }
        //如果出现了运行期异常,后续代码没有执行意义,交给JVM处理,终止程序
        if(arr[4]>100){
            arr[4] = arr[4]/2;

        }else {
            arr[4] = arr[4]/3;
        }
    }
        /*
        * 定义一个抛出编译异常的方法
        * 方法内部抛出了编译异常的方法,方法上就必须声明
        * 方法的调用者就必须处理
        *
        * */
        public static void show() throws Exception {
            throw new Exception();
        }

}
